package pos.gestores;

import java.util.LinkedList;
import java.util.List;

import pos.data.IEventoDAO;
import pos.data.IOfertaDAO;
import pos.data.IPuntoDAO;
import pos.data.IUsuarioDAO;
import pos.data.JDBCEventoDAO;
import pos.data.JDBCOfertaDAO;
import pos.data.JDBCPuntoDAO;
import pos.data.JDBCUsuarioDAO;
import pos.domain.Evento;
import pos.domain.Oferta;
import pos.domain.Punto;
import pos.domain.Usuario;


public class GestorPuntos {
	
	
	 public List<Punto> getPuntosAfinesATitulo(String titulo) {
         List<Punto> puntos = (new JDBCPuntoDAO()).selectPuntosAfinesTitulos(titulo);
         return puntos;
	   }
	
	
	public List<Punto> generaPuntosSector(Double latitudMax, Double longitudMax, Double latitudMin,Double longitudMin){
		List<Punto> puntosEnRango=new LinkedList<Punto>();
		IPuntoDAO ip=new JDBCPuntoDAO();
		puntosEnRango.addAll(ip.selectPuntosCaracteristicas(latitudMax,longitudMax,latitudMin,longitudMin));

		return puntosEnRango;
	}
	
	 public String escogerIcono(String categoria){
	    	
	    	String icono="";
	    	
	    	
	    	  if(categoria.equals("Restaurante")|| categoria.equals("Regonales")){
		        	icono="http://google-maps-icons.googlecode.com/files/restaurantgourmet.png";
		        }else if(categoria.equals("Comida rapida")){
		        	icono="http://google-maps-icons.googlecode.com/files/fastfood.png";
		        }else if(categoria.equals("Pizzeria")){
		        	icono="http://google-maps-icons.googlecode.com/files/pizza.png";
		        }else if(categoria.equals("Asiatico")){
		        	icono="http://google-maps-icons.googlecode.com/files/restaurantchinese.png";
		        }else if(categoria.equals("Mexicano")){
		        	icono="http://google-maps-icons.googlecode.com/files/restaurantmexican.png";
		        }else if(categoria.equals("Vegetariano")){
		        	icono="http://google-maps-icons.googlecode.com/files/restaurantmediterranean.png";
		        }else if(categoria.equals("Marisqueria")){
		        	icono="http://google-maps-icons.googlecode.com/files/restaurantthai.png";
		        }else if(categoria.equals("Heladeria")){
		        	icono="http://google-maps-icons.googlecode.com/files/icecream.png";
		        }else if(categoria.equals("Cafeteria")){
		        	icono="http://google-maps-icons.googlecode.com/files/coffee.png";
		        }

	    	  return icono;
	    	 
	    	
	    }
	
	 public List<Punto> generarPuntoDeInteres(String nick, String nombrePunto, Double latitud, Double longitud,String descripcion, String lugar,String nombreOferta, String tipo, String categoria, Double precioMax, Double precioMin){
	       
	        Oferta oferta= new Oferta();
	        IPuntoDAO ipunto = new JDBCPuntoDAO();
	        IUsuarioDAO iusuario= new JDBCUsuarioDAO();
	        IOfertaDAO ioferta = new JDBCOfertaDAO();
	        List<Punto> puntos= ipunto.selectPuntosByName(nick);
	        String icono=this.escogerIcono(categoria);
	        
	        Punto puntoNuevo= new Punto(nombrePunto,lugar, longitud, latitud, descripcion, iusuario.selectUsuarioByName(nick),icono );
	        ipunto.insertPunto(puntoNuevo);
	        System.out.println("pasa insertPunto");
	       	      
	        
	        Oferta ofertaNueva= new Oferta(nombreOferta, categoria, precioMin, precioMax,tipo,puntoNuevo);
	        ioferta.insertOferta(ofertaNueva);
	        System.out.println("pasa insertOferta");
	        
	        puntoNuevo.getOfertas().add(oferta);
	        System.out.println("Fin de metodo generarPunto");
	        
	        
	        
	       
	         return puntos;
	    }
	   
	 public Punto obtenerPunto(Double longitud, Double latitud){
         Punto p= new Punto();
         List<Punto> puntos= new LinkedList<Punto>();
         IPuntoDAO ip= new JDBCPuntoDAO();
         puntos=ip.selectPuntos(latitud, longitud);
         
         /* En esta versión de la aplicación, solo tratamos el caso en el que hay un solo punto */
         if(!puntos.isEmpty()){
        	 p=puntos.get(0);
         }
         
         return p;
 }

	   public Evento generarEventoDeInteres(String nick,
				 Evento evento, List<Punto> puntosDelEvento) throws Exception {

			
			IEventoDAO ievento = new JDBCEventoDAO();
			GestorUsuario gu= new GestorUsuario();

			Usuario user = gu.getUsuario(nick);
			
			if (user.getPrivilegioAdmin()) {
			
				evento.setPuntos(puntosDelEvento);

				ievento.insertEvento(evento);
			
			}else{
				System.out.println("No es Administrador");
			}

			return evento;
		}

	    public Punto seleccionarPunto(String nombrePunto){
	    	IPuntoDAO ip = new JDBCPuntoDAO();
	    	
	    	return ip.selectPuntoByName(nombrePunto);
	    	
	    	
	    }


	    
	    
	    public List<Evento> seleccionarEventosUsuario(String nick){
	    	List<Evento> res = new LinkedList<Evento>();
	    		res = (new JDBCEventoDAO()).selectNovedades(nick);
	    	return res;
	    }
	    
	    //este metodo no se utiliza solo sirve para el caso en el que el mapa no exista
	    public Punto generarPuntoDeInteresSiNoHayMapa(Usuario usuario, String nombrePunto, Double latitud, Double longitud,String descripcion, String lugar,String nombreOferta, String tipo, String categoria, Double precioMax, Double precioMin){
            
            Oferta oferta= new Oferta();
            IPuntoDAO ipunto = new JDBCPuntoDAO();
            IOfertaDAO ioferta = new JDBCOfertaDAO();
            List<Punto> puntos= new LinkedList<Punto>();
            GestorOfertas gof= new GestorOfertas();
            String icono=this.escogerIcono(categoria);
            Punto punto =ipunto.selectPunto(nombrePunto, latitud,longitud);
            
            puntos= ipunto.selectAllPunto();
            
            if(!puntos.contains(punto)){ //porque no funciona el contains
                    
                oferta= gof.generarOfertaDePuntoYaExistente(punto,nombreOferta, tipo, categoria, precioMax, precioMin);
            }else{
                   
                    Punto puntoNuevo= new Punto(nombrePunto,lugar, latitud, longitud, descripcion, usuario,icono );
                ipunto.insertPunto(puntoNuevo);
                
                Oferta ofertaNueva= new Oferta(nombreOferta, categoria, precioMin, precioMax,tipo,puntoNuevo);
                ioferta.insertOferta(ofertaNueva);
                
            }
            punto.getOfertas().add(oferta);
            
           
             return punto;
        }

}
